package com.jd.rapid.rpc.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.MessageToByteEncoder;

import java.io.Serializable;
import java.lang.management.GarbageCollectorMXBean;
import java.util.List;

/**
 * 解码器
 *
 */
public class RpcDecoder extends ByteToMessageDecoder {

    private Class<?> genericClass;


    public RpcDecoder(Class<?> genericClass){
        this.genericClass=genericClass;
    }


    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) throws Exception {
            //如果请求数据包不足4个字节直接返回，如果大于等于4个字节那么程序继续执行
           if(in.readableBytes()<4){
                //最起码是4个字节
                return;
            }
            //首先记录一下当前的位置
            in.markReaderIndex();
            //当前请求数据包的大小读取出来
            int dataLength=in.readInt();
            if(in.readableBytes()<dataLength){
                 in.resetReaderIndex();
                 return;
            }
            //真正读取需要长度的数据包内容
            byte[] data=new byte[dataLength];
            in.readBytes(data);
            //解码操作，返回指定的对象
            Object obj=Serialization.deserialize(data, genericClass);
            //填充到buffer中，传播给下游hander做实际的处理
            out.add(obj);
    }
}
